package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceCode;
import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AttributeMapper;
import cn.tedu.csmall.product.pojo.dto.AttributeAddNewDTO;
import cn.tedu.csmall.product.pojo.dto.AttributeUpdateDTO;
import cn.tedu.csmall.product.pojo.entity.Attribute;
import cn.tedu.csmall.product.pojo.vo.AttributeListItemVO;
import cn.tedu.csmall.product.pojo.vo.AttributeStandardVO;
import cn.tedu.csmall.product.service.IAttributeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.yaml.snakeyaml.events.Event;

import java.util.List;

@Service
@Slf4j
public class AttributeServiceImpl implements IAttributeService {

    @Autowired
    AttributeMapper attributeMapper;
    /**
     * 添加属性数据
     * @param attributeAddNewDTO
     */
    @Override
    public void addNew(AttributeAddNewDTO attributeAddNewDTO) {
        //根据名称获取属性表数据数量
        String attributeName=attributeAddNewDTO.getName();
        int countByName = attributeMapper.countByName(attributeName);
        //如果存在同名数据，抛出异常
        if(countByName>0){
            String message="添加属性失败，属性【"+attributeName+"】已存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }
        //如果不存在，创建Attribute对象，将DTO对象复制到Attribute对象中
        Attribute attribute=new Attribute();
        BeanUtils.copyProperties(attributeAddNewDTO,attribute);
        //调用mapper接口的insert方法，获取受影响的行数
        int rows = attributeMapper.insert(attribute);
        //如果行数不为1，抛出异常
        if(rows!=1){
            String message="添加属性失败，系统异常，请稍后重试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
        //输出日志，添加成功
        log.debug("添加属性成功！");
    }

    /**
     * 根据id删除属性
     * @param id
     */
    @Override
    public void deleteById(Long id) {
        //根据id获取属性VO对象
        AttributeStandardVO attributeStandardVO = attributeMapper.getAttributeStandardVO(id);
        //如果对象为null，抛出异常
        if(attributeStandardVO==null){
            String message="删除属性失败，属性不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        //调用mapper接口的deleteById方法，获取受影响行数
        int rows = attributeMapper.deleteById(id);
        //如果行数不为1，抛出异常
        if(rows!=1){
            String message="删除属性失败，系统异常，请稍后重试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
        //输出删除成功日志
        log.debug("删除属性成功！");
    }

    /**
     * 根据id修改属性表数据
     * @param id
     * @param attributeUpdateDTO
     */
    @Override
    public void updateById(Long id, AttributeUpdateDTO attributeUpdateDTO) {
        //根据id获取VO对象
        AttributeStandardVO queryResult = attributeMapper.getAttributeStandardVO(id);
        //如果对象不存在，抛出异常
        if(queryResult==null){
            String message="修改属性失败，属性不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        //如果存在，创建属性对象，把DTO复制到属性对象中，设置id值
        Attribute attribute=new Attribute();
        BeanUtils.copyProperties(attributeUpdateDTO,attribute);
        attribute.setId(id);
        //调用mapper接口的updateById方法，获取受影响行数
        int rows = attributeMapper.updateById(attribute);
        //如果行数不为1，抛出异常
        if(rows!=1){
            String message="修改属性失败，系统异常，请稍后重试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
        //输出日志修改成功！
        log.debug("属性修改成功！");
    }

    /**
     * 根据属性模板id获取属性列表
     * @param templateId
     * @return
     */
    @Override
    public List<AttributeListItemVO> list(Long templateId) {
        return attributeMapper.list(templateId);
    }
}
